package top.eggcode.common.lang;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.oned.Code128Writer;

import javax.imageio.ImageIO;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * 图形码工具类
 * 生成的图片默认是png
 * Created at 2020/12/4
 *
 * @author DingJiaQi
 * @version 1.0
 */
public class GraphicCodeUtil {
    /**
     * generateCode 根据code生成相应的一维条码
     * 宽度自适应（自适应方案生成的图片没有多余的白边）
     *
     * @param targetPath    文件保存路径
     * @param content       编码内容
     * @param magnification 放大倍数
     * @param height        图形码高度
     */
    public static void generateBarCodeByMagnification(String targetPath, String content, int magnification, int height) {

        // 将位图矩阵BitMatrix保存为图片
        try (FileOutputStream outStream = new FileOutputStream(new File(targetPath))) {
            MultiFormatWriter writer = new MultiFormatWriter();

            Map<EncodeHintType, Object> hints = new HashMap<>(10);
            hints.put(EncodeHintType.MARGIN, 0);
            int widthContent = new Code128Writer().encode(content).length;

            int widthCode = widthContent * magnification;
            // 定义位图矩阵
            // 图像数据转换，使用了矩阵转换 参数顺序分别为：编码内容，编码类型，生成图片宽度，生成图片高度，设置参数
            BitMatrix matrix = writer.encode(content,
                    BarcodeFormat.CODE_128,
                    widthCode,
                    height,
                    hints);

            ImageIO.write(MatrixToImageWriter.toBufferedImage(matrix), "png", outStream);
            outStream.flush();
        } catch (IOException | WriterException e) {
            e.printStackTrace();
        }
    }

    /**
     * generateCode 根据code生成相应的一维条码
     *
     * @param targetPath 文件保存路径
     * @param content    编码内容
     * @param width      图形吗宽度
     * @param height     图形码高度
     */
    public static void generateBarCode(String targetPath, String content, int width, int height) {

        // 将位图矩阵BitMatrix保存为图片
        try (FileOutputStream outStream = new FileOutputStream(new File(targetPath))) {
            MultiFormatWriter writer = new MultiFormatWriter();

            // 定义位图矩阵
            // 图像数据转换，使用了矩阵转换 参数顺序分别为：编码内容，编码类型，生成图片宽度，生成图片高度，设置参数
            BitMatrix matrix = writer.encode(content,
                    BarcodeFormat.CODE_128,
                    width, height,
                    null);

            ImageIO.write(MatrixToImageWriter.toBufferedImage(matrix), "png", outStream);
            outStream.flush();
        } catch (IOException | WriterException e) {
            e.printStackTrace();
        }
    }

}
